package lp2.projeto.horario;

import org.junit.*;

/**
 * Classe que testa a classe Intervalo
 */
public class TestaIntervalo {
	/**
	 * Testa os getters
	 */
	@Test public void testaGetters() {
		Horario horario1 = new Horario(2010, Mes.OUTUBRO, 20, 8, 13);
		Horario horario2 = new Horario(2011, Mes.NOVEMBRO, 22, 9, 14);
		Intervalo intervalo = new Intervalo(horario1, horario2);
		Assert.assertEquals(horario1, intervalo.getInicio());
		Assert.assertEquals(horario2, intervalo.getFim());
	}
	
	/**
	 * Testa a excecao que o construtor gera quando o intervalo eh invalido
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testaExcecaoConstrutor() {
		Horario horario1 = new Horario(2010, Mes.OUTUBRO, 20, 8, 13);
		Horario horario2 = new Horario(2011, Mes.NOVEMBRO, 22, 9, 14);
		new Intervalo(horario2, horario1);		
	}
	
	/**
	 * Testa o construtor que tambem recebe a duracao como parametro
	 */
	@Test public void testaConstrutorComDuracao() {
		Horario horario1 = new Horario(2004, Mes.JANEIRO, 1, 0, 0);
		Assert.assertEquals(new Horario(2004, Mes.JANEIRO, 1, 0, 2), new Intervalo(horario1, 2).getFim());
		Assert.assertEquals(new Horario(2004, Mes.JANEIRO, 1, 1, 2), new Intervalo(horario1, 62).getFim());
		Assert.assertEquals(new Horario(2004, Mes.JANEIRO, 2, 1, 2), new Intervalo(horario1, 25*60+2).getFim());
		Assert.assertEquals(new Horario(2004, Mes.FEVEREIRO, 1, 1, 2), new Intervalo(horario1, 31*24*60+62).getFim());
	}
	
	/**
	 * Testa getDuracao
	 */
	@Test public void testaGetDuracao() {
		Horario horario1 = new Horario(2010, Mes.NOVEMBRO, 20, 8, 13);
		for (int duracao = 1; duracao < 100000000; duracao=5*duracao+17)
			Assert.assertEquals(duracao, new Intervalo(horario1, duracao).getDuracao());
	}
	
	/**
	 * Testa a funcao colideCom
	 */
	@Test public void testaColideCom() {
		Horario[] horarios = new Horario[]{
				new Horario(2010, Mes.OUTUBRO, 20, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 20, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 9, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 9, 14),
				new Horario(2011, Mes.NOVEMBRO, 22, 9, 14)
		};
		for (int inicio1 = 0; inicio1 < horarios.length; inicio1++)
			for (int fim1 = inicio1+1; fim1 < horarios.length; fim1++)
				for (int inicio2 = 0; inicio2 < horarios.length; inicio2++)
					for (int fim2 = inicio2+1; fim2 < horarios.length; fim2++) {
						Intervalo intervalo1 = new Intervalo(horarios[inicio1], horarios[fim1]);
						Intervalo intervalo2 = new Intervalo(horarios[inicio2], horarios[fim2]);
						Assert.assertEquals(fim1 <= inicio2 || fim2 <= inicio1, !intervalo1.colideCom(intervalo2));
					}
	}
	
	/**
	 * Testa a funcao compareTo
	 */
	@Test public void testaCompareTo() {
		Horario[] horarios = new Horario[]{
				new Horario(2010, Mes.OUTUBRO, 20, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 20, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 9, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 9, 14),
				new Horario(2011, Mes.NOVEMBRO, 22, 9, 14)
		};
		for (int inicio = 0; inicio < horarios.length; inicio++)
			for (int fim = inicio+1; fim < horarios.length; fim++)
				for (int i = 0; i < horarios.length; i++)
					Assert.assertEquals(horarios[inicio].compareTo(horarios[i]),
							new Intervalo(horarios[inicio], horarios[fim]).compareTo(horarios[i]));
	}
	
	/**
	 * Testa a funcao toString
	 */
	@Test public void testaToString() {
		Horario horario1 = new Horario(2010, Mes.OUTUBRO, 20, 8, 13);
		Horario horario2 = new Horario(2011, Mes.NOVEMBRO, 22, 9, 14);
		Intervalo intervalo = new Intervalo(horario1, horario2);
		Assert.assertEquals("(20/10/2010 8:13, 22/11/2011 9:14)", intervalo.toString());
	}
}
